/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vm.project;

import java.util.ArrayList;

/**
 *
 * @author florianfourure
 */
public class Marshing {
    
    public Vecteur cas1(Point p1,Point p2,Point p3,Point p4, double v){
        double xp1 = (((p2.getX()-p1.getX())*(v-p1.getV()))/(p2.getV()-p1.getV()))+p1.getX();
        double yp1 = (((p2.getY()-p1.getY())*(v-p1.getV()))/(p2.getV()-p1.getV())+p1.getY());
        double xp2 = (((p3.getX()-p1.getX())*(v-p1.getV()))/(p3.getV()-p1.getV())+p1.getX());
        double yp2 = (((p3.getY()-p1.getY())*(v-p1.getV()))/(p3.getV()-p1.getV())+p1.getY());
        return new Vecteur(new Point(xp1,yp1,2,v), new Point(xp2,yp2,2,v)) ;
    }
    public Vecteur cas2(Point p1,Point p2,Point p3,Point p4, double v){
        double xp1 = (((p2.getX()-p1.getX())*(v-p1.getV()))/(p2.getV()-p1.getV()))+p1.getX();
        double yp1 = (((p2.getY()-p1.getY())*(v-p1.getV()))/(p2.getV()-p1.getV()))+p1.getY();
        double xp2 = (((p3.getX()-p4.getX())*(v-p4.getV()))/(p3.getV()-p4.getV()))+p4.getX();
        double yp2 = (((p3.getY()-p4.getY())*(v-p4.getV()))/(p3.getV()-p4.getV()))+p4.getY();
        return new Vecteur(new Point(xp1,yp1,2,v),new Point(xp2,yp2,2,v));
    }
    
    public int getCas(Point p1,Point p2,Point p3,Point p4,double valeur){
        int nbPlus =0;
        int nbMoins=0;
        if(p1.getV()<valeur){
            nbMoins++;
        }else{
            nbPlus++;
        }
        if(p2.getV()<valeur){
            nbMoins++;
        }else{
            nbPlus++;
        }
        if(p3.getV()<valeur){
            nbMoins++;
        }else{
            nbPlus++;
        }
        if(p4.getV()<valeur){
            nbMoins++;
        }else{
            nbPlus++;
        }
        if(nbPlus==4 || nbMoins==4){
            return 0;
        }else if(nbPlus==1 || nbMoins==1){
            return 1;
        }else{
            boolean p1IsPlus = p1.getV()>valeur;
            boolean p4IsPlus = p4.getV()>valeur;
            if((p1IsPlus && p4IsPlus) || (!p1IsPlus && !p4IsPlus)){
                return 3;
            }else{
                return 2;
            }
        }       
    }
    
    public Vecteur cas1general(Point p1,Point p2,Point p3,Point p4,double valeur){
        boolean p1IsPlus = p1.getV() > valeur;
        boolean p2IsPlus = p2.getV() > valeur;
        boolean p3IsPlus = p3.getV() > valeur;
        boolean p4IsPlus = p4.getV() > valeur;
        if( (p1IsPlus && !p2IsPlus && !p3IsPlus && !p4IsPlus) ||
                ( !p1IsPlus && p2IsPlus && p3IsPlus && p4IsPlus)){
            return cas1(p1, p2, p3, p4, valeur);
        }else{
            return cas1general(p2,p4,p1,p3,valeur);
        }
    }    
    public Vecteur cas2general(Point p1,Point p2,Point p3,Point p4,double valeur){
        boolean p1IsPlus = p1.getV() > valeur;
        boolean p2IsPlus = p2.getV() > valeur;
        boolean p3IsPlus = p3.getV() > valeur;
        boolean p4IsPlus = p4.getV() > valeur;
        if( (p1IsPlus && !p2IsPlus && p3IsPlus && !p4IsPlus) ||
                ( !p1IsPlus && p2IsPlus && !p3IsPlus && p4IsPlus)){
            return cas2(p1, p2, p3, p4, valeur);
        }else{
            return cas2general(p2,p4,p1,p3,valeur);
        }
    }
    
    public ArrayList<Vecteur> calcul(ArrayList<ArrayList<Point>> tab,double valeur){
        ArrayList<Vecteur> vec = new ArrayList<>();
        for(int i=0; i<tab.size()-2;i++){
            for(int j=0;j<tab.get(i).size()-2;j++){
                Point p1=tab.get(i).get(j);
                Point p2=tab.get(i+1).get(j);
                Point p3=tab.get(i).get(j+1);
                Point p4=tab.get(i+1).get(j+1);
                switch (getCas(p1,p2,p3,p4, valeur)) {
                    case 0 :
                        break;
                    case 1 :
                        vec.add(this.cas1general(p1, p2, p3, p4, valeur));
                        break;
                    case 2 :
                        vec.add(this.cas2general(p1, p2, p3, p4, valeur));
                        break;
                    case 3 :
                        System.err.println("Attention ya un cas 4");
                        break;
                }
            }
        }
        
        return vec;
    }

}
